﻿using Newtonsoft.Json;
using System.Collections;

namespace Leo.Common.Json
{
    public class EnumToStringConverter //: JsonConverter
    {

        //private readonly bool _outputEnumText;

        //private readonly bool _outputNumberFirst;

        //private readonly string _scene;
        //public EnumToStringConverter() : this(false)
        //{
        //}
        //public EnumToStringConverter(bool outputEnumText)
        //{
        //    this._outputEnumText = outputEnumText;
        //}

        //public EnumToStringConverter(bool outputEnumText, bool numbersFirst)
        //{
        //    this._outputEnumText = outputEnumText;
        //    this._outputNumberFirst = numbersFirst;
        //}

        //public EnumToStringConverter(bool outputEnumText, string scene) : this(outputEnumText)
        //{
        //    this._scene = scene;
        //}

        //public override bool CanConvert(Type objectType)
        //{
        //    return objectType.IsEnum() || Enumeration.IsAssignableFrom(objectType);
        //}

        //public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        //{
        //    if (typeof(IEnumerable).IsAssignableFrom(objectType))
        //    {
        //        return null;
        //    }
        //    object value = reader.Value;
        //    object result;
        //    if (EnumDescriptor.TryParseTo(objectType, (value != null) ? value.ToString() : null, true, out result))
        //    {
        //        return result;
        //    }
        //    throw new ApplicationException(string.Format("反序列枚举项出现异常，枚举类型：{0}，Json值：{1}", EnumToStringConverter.GetTypeName(objectType), value));
        //}

        //internal static string GetTypeName(Type enumType)
        //{
        //    if (enumType.IsGenericType && enumType.GetGenericTypeDefinition() == typeof(Nullable))
        //    {
        //        enumType = Nullable.GetUnderlyingType(enumType);
        //    }
        //    return enumType.Name;
        //}

        //public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        //{
        //    if (value == null)
        //    {
        //        return;
        //    }
        //    Type type = value.GetType();
        //    if (!type.IsEnum() && !type.IsArray && type.GetInterface("IEnumerable") == null)
        //    {
        //        serializer.Serialize(writer, value);
        //        return;
        //    }
        //    IEnumerable enumerable = value as IEnumerable;
        //    if (enumerable != null)
        //    {
        //        writer.WriteStartArray();
        //        foreach (object obj in enumerable)
        //        {
        //            if (!obj.GetType().IsEnum())
        //            {
        //                serializer.Serialize(writer, obj);
        //            }
        //            else
        //            {
        //                EnumDescriptor descriptor = obj.ToDescriptor();
        //                this.WriteJsonValue(writer, descriptor);
        //            }
        //        }
        //        writer.WriteEndArray();
        //        return;
        //    }
        //    EnumDescriptor enumDescriptor = value.ToDescriptor();
        //    if (enumDescriptor == null)
        //    {
        //        writer.WriteValue(value);
        //        return;
        //    }
        //    this.WriteJsonValue(writer, enumDescriptor);
        //    this.AppendProperty(writer, enumDescriptor.GetDescription(this._scene, true) ?? enumDescriptor.Name);
        //}

        //private void WriteJsonValue(JsonWriter writer, EnumDescriptor descriptor)
        //{
        //    object obj = (this._outputNumberFirst || string.IsNullOrEmpty(descriptor.StringValue)) ? descriptor.Value : descriptor.StringValue;
        //    writer.WriteValue(obj);
        //}

        //private void AppendProperty(JsonWriter writer, string value)
        //{
        //    if (this._outputEnumText && writer.WriteState != WriteState.Array)
        //    {
        //        string text = writer.Path;
        //        if (text.Contains("."))
        //        {
        //            string text2 = text;
        //            int num = text.LastIndexOf(".") + 1;
        //            text = text2.Substring(num, text2.Length - num);
        //        }
        //        writer.WritePropertyName(text + "Text");
        //        writer.WriteValue(value);
        //    }
        //}


    }
}
